1   /*
2    * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package javax.swing.colorchooser;
27  
28  import javax.swing.*;
29  import java.awt.*;
30  import java.awt.event.*;
31  import javax.swing.event.*;
32  import javax.swing.text.*;
33  import java.io.Serializable;
34  
35  
36  /**
37    * A better GridLayout class
38    *
39    * @author Steve Wilson
40    */
41  class SmartGridLayout implements LayoutManager, Serializable {
42  
43    int rows = 2;
44    int columns = 2;
45    int xGap = 2;
46    int yGap = 2;
47    int componentCount = 0;
48    Component[][] layoutGrid;
49  
50  
51    public SmartGridLayout(int numColumns, int numRows) {
52      rows = numRows;
53      columns = numColumns;
54      layoutGrid = new Component[numColumns][numRows];
55  
56    }
57  
58  
59    public void layoutContainer(Container c) {
60  
61      buildLayoutGrid(c);
62  
63      int[] rowHeights = new int[rows];
64      int[] columnWidths = new int[columns];
65  
66      for (int row = 0; row < rows; row++) {
67          rowHeights[row] = computeRowHeight(row);
68      }
69  
70      for (int column = 0; column < columns; column++) {
71          columnWidths[column] = computeColumnWidth(column);
72      }
73  
74  
75      Insets insets = c.getInsets();
76  
77      if (c.getComponentOrientation().isLeftToRight()) {
78          int horizLoc = insets.left;
79          for (int column = 0; column < columns; column++) {
80            int vertLoc = insets.top;
81  
82            for (int row = 0; row < rows; row++) {
83              Component current = layoutGrid[column][row];
84  
85              current.setBounds(horizLoc, vertLoc, columnWidths[column], rowHeights[row]);
86              //  System.out.println(current.getBounds());
87              vertLoc += (rowHeights[row] + yGap);
88            }
89            horizLoc += (columnWidths[column] + xGap );
90          }
91      } else {
92          int horizLoc = c.getWidth() - insets.right;
93          for (int column = 0; column < columns; column++) {
94            int vertLoc = insets.top;
95            horizLoc -= columnWidths[column];
96  
97            for (int row = 0; row < rows; row++) {
98              Component current = layoutGrid[column][row];
99  
100             current.setBounds(horizLoc, vertLoc, columnWidths[column], rowHeights[row]);
101             //  System.out.println(current.getBounds());
102             vertLoc += (rowHeights[row] + yGap);
103           }
104           horizLoc -= xGap;
105         }
106     }
107 
108 
109 
110   }
111 
112   public Dimension minimumLayoutSize(Container c) {
113 
114     buildLayoutGrid(c);
115     Insets insets = c.getInsets();
116 
117 
118 
119     int height = 0;
120     int width = 0;
121 
122     for (int row = 0; row < rows; row++) {
123         height += computeRowHeight(row);
124     }
125 
126     for (int column = 0; column < columns; column++) {
127         width += computeColumnWidth(column);
128     }
129 
130     height += (yGap * (rows - 1)) + insets.top + insets.bottom;
131     width += (xGap * (columns - 1)) + insets.right + insets.left;
132 
133     return new Dimension(width, height);
134 
135 
136   }
137 
138   public Dimension preferredLayoutSize(Container c) {
139       return minimumLayoutSize(c);
140   }
141 
142 
143   public void addLayoutComponent(String s, Component c) {}
144 
145   public void removeLayoutComponent(Component c) {}
146 
147 
148   private void buildLayoutGrid(Container c) {
149 
150       Component[] children = c.getComponents();
151 
152       for (int componentCount = 0; componentCount < children.length; componentCount++) {
153         //      System.out.println("Children: " +componentCount);
154         int row = 0;
155         int column = 0;
156 
157         if (componentCount != 0) {
158           column = componentCount % columns;
159           row = (componentCount - column) / columns;
160         }
161 
162         //      System.out.println("inserting into: "+ column +  " " + row);
163 
164         layoutGrid[column][row] = children[componentCount];
165       }
166   }
167 
168   private int computeColumnWidth(int columnNum) {
169     int maxWidth = 1;
170     for (int row = 0; row < rows; row++) {
171       int width = layoutGrid[columnNum][row].getPreferredSize().width;
172       if (width > maxWidth) {
173         maxWidth = width;
174       }
175     }
176     return maxWidth;
177   }
178 
179   private int computeRowHeight(int rowNum) {
180     int maxHeight = 1;
181     for (int column = 0; column < columns; column++) {
182       int height = layoutGrid[column][rowNum].getPreferredSize().height;
183       if (height > maxHeight) {
184         maxHeight = height;
185       }
186     }
187     return maxHeight;
188   }
189 
190 }